{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Four Demos"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# use pip (or, conda) to make sure numpy is installed:\n",
    "!pip -q install numpy  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from mpyc.runtime import mpc\n",
    "import secretsanta, id3gini, lpsolver, cnnmnist"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Default runs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Setting input to default = 8\n",
      "2019-10-13 22:37:36,051 Start MPyC runtime v0.5.10\n",
      "Using secure integers: SecInt32\n",
      "2 [1, 0]\n",
      "3 [1, 2, 0]\n",
      "4 [1, 3, 0, 2]\n",
      "5 [4, 3, 1, 0, 2]\n",
      "6 [3, 0, 4, 5, 2, 1]\n",
      "7 [4, 6, 1, 5, 3, 0, 2]\n",
      "8 [3, 2, 7, 4, 6, 0, 5, 1]\n",
      "Using secure fixed-point numbers: SecFxp32:16\n",
      "2 [1.0, 0.0]\n",
      "3 [2.0, 0.0, 1.0]\n",
      "4 [2.0, 3.0, 0.0, 1.0]\n",
      "5 [1.0, 3.0, 0.0, 4.0, 2.0]\n",
      "6 [5.0, 2.0, 3.0, 0.0, 1.0, 4.0]\n",
      "7 [2.0, 3.0, 5.0, 6.0, 1.0, 0.0, 4.0]\n",
      "8 [4.0, 6.0, 5.0, 1.0, 2.0, 0.0, 7.0, 3.0]\n",
      "Using secure prime fields: SecFld3(GF(11))\n",
      "2 [1, 0]\n",
      "3 [2, 0, 1]\n",
      "4 [3, 2, 1, 0]\n",
      "5 [3, 4, 0, 1, 2]\n",
      "6 [1, 2, 5, 4, 0, 3]\n",
      "7 [5, 2, 4, 6, 3, 1, 0]\n",
      "8 [7, 2, 4, 5, 1, 0, 3, 6]\n",
      "Using secure binary fields: SecFld3(GF(2^3))\n",
      "2 [1, 0]\n",
      "3 [1, x, 0]\n",
      "4 [x, x+1, 1, 0]\n",
      "5 [x^2, x, 1, 0, x+1]\n",
      "6 [x+1, 0, x^2, x, x^2+1, 1]\n",
      "7 [x^2+1, x+1, x^2+x, 1, x, x^2, 0]\n",
      "8 [1, x+1, x^2, x^2+x+1, x^2+x, x, 0, x^2+1]\n",
      "Using secure quinary fields: SecFld4(GF(5^2))\n",
      "2 [1, 0]\n",
      "3 [2, 0, 1]\n",
      "4 [3, 2, 1, 0]\n",
      "5 [1, 2, 4, 0, 3]\n",
      "6 [4, x, 0, 1, 3, 2]\n",
      "7 [x, x+1, 0, 4, 1, 2, 3]\n",
      "8 [1, 4, x, x+1, x+2, 0, 2, 3]\n",
      "Using secure extension fields (medium prime): SecFld24(GF(11^7))\n",
      "2 [1, 0]\n",
      "3 [2, 0, 1]\n",
      "4 [2, 3, 1, 0]\n",
      "5 [3, 4, 1, 0, 2]\n",
      "6 [3, 5, 4, 1, 0, 2]\n",
      "7 [1, 5, 0, 2, 6, 3, 4]\n",
      "8 [5, 2, 4, 7, 0, 1, 3, 6]\n",
      "Using secure extension fields (larger prime): SecFld30(GF(1031^3))\n",
      "2 [1, 0]\n",
      "3 [1, 2, 0]\n",
      "4 [3, 2, 1, 0]\n",
      "5 [4, 0, 3, 2, 1]\n",
      "6 [5, 2, 4, 1, 0, 3]\n",
      "7 [1, 4, 0, 5, 3, 6, 2]\n",
      "8 [1, 2, 3, 4, 6, 0, 7, 5]\n",
      "2019-10-13 22:37:36,743 Stop MPyC runtime -- elapsed time: 0:00:00.692499\n"
     ]
    }
   ],
   "source": [
    "mpc.run(secretsanta.main())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using secure integers: SecInt32\n",
      "dataset: tennis with 14 samples and 4 attributes\n",
      "2019-10-13 22:37:39,550 Start MPyC runtime v0.5.10\n",
      "2019-10-13 22:37:39,566 Attribute node 0\n",
      "2019-10-13 22:37:39,566 Leaf node label 1\n",
      "2019-10-13 22:37:39,585 Attribute node 3\n",
      "2019-10-13 22:37:39,589 Leaf node label 0\n",
      "2019-10-13 22:37:39,593 Leaf node label 1\n",
      "2019-10-13 22:37:39,601 Attribute node 2\n",
      "2019-10-13 22:37:39,605 Leaf node label 0\n",
      "2019-10-13 22:37:39,609 Leaf node label 1\n",
      "2019-10-13 22:37:39,609 Stop MPyC runtime -- elapsed time: 0:00:00.058882\n",
      "Decision tree of depth 2 and size 8: \n",
      "if Outlook == Overcast: Yes\n",
      "if Outlook == Rain: \n",
      "|   if Wind == Strong: No\n",
      "|   if Wind == Weak: Yes\n",
      "if Outlook == Sunny: \n",
      "|   if Humidity == High: No\n",
      "|   if Humidity == Normal: Yes\n"
     ]
    }
   ],
   "source": [
    "mpc.run(id3gini.main())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2019-10-13 22:37:41,797 Setting certificate file to default = c0.cert\n",
      "2019-10-13 22:37:41,797 Start MPyC runtime v0.5.10\n",
      "2019-10-13 22:37:41,797 0 Termination?...\n",
      "2019-10-13 22:37:41,797 1 Determining pivot...\n",
      "2019-10-13 22:37:41,797 1 Updating tableau...\n",
      "2019-10-13 22:37:41,797 1 Termination?...\n",
      "2019-10-13 22:37:41,797 2 Determining pivot...\n",
      "2019-10-13 22:37:41,813 2 Updating tableau...\n",
      "2019-10-13 22:37:41,813 2 Termination?...\n",
      "2019-10-13 22:37:41,813 Termination...\n",
      " max(f) = 21 / 2 = 10.500000\n",
      "2019-10-13 22:37:41,813 Computing solution...\n",
      "2019-10-13 22:37:41,813 Computing dual solution...\n",
      "2019-10-13 22:37:41,823 Stop MPyC runtime -- elapsed time: 0:00:00.025458\n",
      "2019-10-13 22:37:41,823 Writing output to c0.cert.\n"
     ]
    }
   ],
   "source": [
    "mpc.run(lpsolver.main())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2019-10-13 22:37:43,804 Start MPyC runtime v0.5.10\n",
      "2019-10-13 22:37:43,820 --------------- INPUT   -------------\n",
      "Type = SecInt37, range = (8560, 8561)\n",
      "Labels: [2]\n",
      "[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0]\n",
      " [0 0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 0 0]\n",
      " [0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0]\n",
      " [0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]\n",
      "2019-10-13 22:37:43,872 --------------- LAYER 1 -------------\n",
      "2019-10-13 22:37:43,884 - - - - - - - - conv2d  - - - - - - -\n",
      "2019-10-13 22:37:44,300 Barrier 0 1 [2475]\n",
      "2019-10-13 22:37:44,300 - - - - - - - - maxpool - - - - - - -\n",
      "2019-10-13 22:37:54,999 Barrier 0 1 [77739]\n",
      "2019-10-13 22:37:54,999 - - - - - - - - ReLU    - - - - - - -\n",
      "2019-10-13 22:37:58,547 Barrier 0 1 [102831]\n",
      "2019-10-13 22:37:58,547 --------------- LAYER 2 -------------\n",
      "2019-10-13 22:37:58,650 - - - - - - - - conv2d  - - - - - - -\n",
      "2019-10-13 22:37:59,930 Barrier 1 1 [102831]\n",
      "2019-10-13 22:38:01,039 Barrier 1 1 [102831]\n",
      "2019-10-13 22:38:02,140 Barrier 1 1 [102831]\n",
      "2019-10-13 22:38:03,374 Barrier 1 1 [102831]\n",
      "2019-10-13 22:38:03,544 Barrier 0 1 [102831]\n",
      "2019-10-13 22:38:03,544 - - - - - - - - maxpool - - - - - - -\n",
      "2019-10-13 22:38:09,425 Barrier 0 1 [140463]\n",
      "2019-10-13 22:38:09,425 - - - - - - - - ReLU    - - - - - - -\n",
      "2019-10-13 22:38:11,499 Barrier 0 1 [153011]\n",
      "2019-10-13 22:38:11,499 --------------- LAYER 3 -------------\n",
      "2019-10-13 22:38:17,182 - - - - - - - - fc      - - - - - - -\n",
      "2019-10-13 22:38:20,400 - - - - - - - - ReLU    - - - - - - -\n",
      "2019-10-13 22:38:21,178 Barrier 0 1 [157111]\n",
      "2019-10-13 22:38:21,178 --------------- LAYER 4 -------------\n",
      "2019-10-13 22:38:21,421 - - - - - - - - fc      - - - - - - -\n",
      "2019-10-13 22:38:21,437 --------------- OUTPUT  -------------\n",
      "Image #8560 with label 2: 2 predicted. \n",
      "[-6868031633, -2171506302, 22837508400, 2505898840, -1948097771, -10545485323, -13796328736, -7001013084, 480740992, -4528261732]\n",
      "2019-10-13 22:38:21,449 Stop MPyC runtime -- elapsed time: 0:00:37.644784\n"
     ]
    }
   ],
   "source": [
    "mpc.run(cnnmnist.main()) # takes a minute or so"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Runs with specific inputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using secure integers: SecInt32\n",
      "2 [1, 0]\n",
      "3 [1, 2, 0]\n",
      "4 [1, 3, 0, 2]\n",
      "5 [4, 0, 1, 2, 3]\n",
      "6 [2, 5, 3, 0, 1, 4]\n",
      "Using secure fixed-point numbers: SecFxp32:16\n",
      "2 [1.0, 0.0]\n",
      "3 [1.0, 2.0, 0.0]\n",
      "4 [3.0, 2.0, 1.0, 0.0]\n",
      "5 [3.0, 4.0, 0.0, 1.0, 2.0]\n",
      "6 [2.0, 5.0, 1.0, 4.0, 0.0, 3.0]\n",
      "Using secure prime fields: SecFld2(GF(7))\n",
      "2 [1, 0]\n",
      "3 [1, 2, 0]\n",
      "4 [1, 2, 3, 0]\n",
      "5 [3, 4, 1, 2, 0]\n",
      "6 [3, 2, 5, 0, 1, 4]\n",
      "Using secure binary fields: SecFld3(GF(2^3))\n",
      "2 [1, 0]\n",
      "3 [1, x, 0]\n",
      "4 [x, x+1, 0, 1]\n",
      "5 [1, x+1, 0, x^2, x]\n",
      "6 [x^2+1, 0, 1, x^2, x, x+1]\n",
      "Using secure quinary fields: SecFld4(GF(5^2))\n",
      "2 [1, 0]\n",
      "3 [1, 2, 0]\n",
      "4 [3, 2, 0, 1]\n",
      "5 [1, 3, 0, 4, 2]\n",
      "6 [x, 0, 1, 4, 3, 2]\n",
      "Using secure extension fields (medium prime): SecFld24(GF(11^7))\n",
      "2 [1, 0]\n",
      "3 [2, 0, 1]\n",
      "4 [1, 3, 0, 2]\n",
      "5 [3, 2, 4, 1, 0]\n",
      "6 [5, 0, 1, 4, 3, 2]\n",
      "Using secure extension fields (larger prime): SecFld30(GF(1031^3))\n",
      "2 [1, 0]\n",
      "3 [2, 0, 1]\n",
      "4 [1, 3, 0, 2]\n",
      "5 [2, 3, 1, 4, 0]\n",
      "6 [1, 3, 5, 0, 2, 4]\n",
      "\n",
      "Using secure integers: SecInt95\n",
      "dataset: car with 1728 samples and 6 attributes\n",
      "Decision tree of depth 3 and size 25: \n",
      "if safety == high: \n",
      "|   if persons == 2: unacc\n",
      "|   if persons == 4: \n",
      "|   |   if buying == high: acc\n",
      "|   |   if buying == low: vgood\n",
      "|   |   if buying == med: acc\n",
      "|   |   if buying == vhigh: unacc\n",
      "|   if persons == more: \n",
      "|   |   if buying == high: acc\n",
      "|   |   if buying == low: vgood\n",
      "|   |   if buying == med: acc\n",
      "|   |   if buying == vhigh: unacc\n",
      "if safety == low: unacc\n",
      "if safety == med: \n",
      "|   if persons == 2: unacc\n",
      "|   if persons == 4: \n",
      "|   |   if buying == high: unacc\n",
      "|   |   if buying == low: acc\n",
      "|   |   if buying == med: acc\n",
      "|   |   if buying == vhigh: unacc\n",
      "|   if persons == more: \n",
      "|   |   if lug_boot == big: acc\n",
      "|   |   if lug_boot == med: acc\n",
      "|   |   if lug_boot == small: unacc\n",
      "\n",
      " max(f) = 1705860 / 495720 = 3.441176\n",
      "\n",
      "Type = SecFxp10:4, range = (9682, 9683)\n",
      "Labels: [1]\n",
      "[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
      " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]\n",
      "Image #9682 with label 1: 1 predicted. \n",
      "[-1.625, 14.9375, 1.5625, -8.625, -0.4375, -10.75, -9.625, 3.0625, 4.0, -7.5]\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "mpc.logging(False)\n",
    "\n",
    "sys.argv[1:] = ['6']\n",
    "mpc.run(secretsanta.main())\n",
    "\n",
    "print()\n",
    "\n",
    "sys.argv[1:] = ['-i', '2']\n",
    "mpc.run(id3gini.main())\n",
    "\n",
    "print()\n",
    "\n",
    "sys.argv[1:] = ['-d', 'LPExample_R20']\n",
    "mpc.options.bit_length = 84\n",
    "mpc.run(lpsolver.main())\n",
    "\n",
    "print()\n",
    "\n",
    "sys.argv[1:] = ['1.5']  # forces use of secure fixed-point arithmetic\n",
    "mpc.run(cnnmnist.main())     # takes a minute or so\n",
    "\n",
    "sys.argv[1:] = []"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
